package com.app.gamev2.utils

import android.graphics.RectF
import com.app.gamev2.objects.Bucket
import com.app.gamev2.objects.Platform
import com.app.gamev2.objects.Player

/**
 * 碰撞检测工具类，封装各种碰撞检测算法
 */
object CollisionUtils {
    /**
 * 检测气球是否与平台碰撞
 * @param player 气球对象
 * @param platform 平台对象
 * @return 是否发生碰撞
 */
fun checkPlayerPlatformCollision(player: Player, platform: Platform): Boolean {
    // 创建气球的碰撞矩形（简化为矩形）
        val playerRect = RectF(
            player.position.x - player.size / 2,
            player.position.y - player.size / 2,
            player.position.x + player.size / 2,
            player.position.y + player.size / 2
        )
        
        // 创建平台的碰撞矩形
        val platformRect = RectF(
            platform.position.x,
            platform.position.y,
            platform.position.x + platform.width,
            platform.position.y + platform.height
        )
        
        // 检测两个矩形是否相交
        return playerRect.intersect(platformRect)
    }

    /**
 * 检测气球是否踩在平台上（落地判定）
 * @param player 气球对象
 * @param platform 平台对象
 * @return 是否踩在平台上
 */
fun checkPlayerLandingOnPlatform(player: Player, platform: Platform): Boolean {
    // 落地判定条件：
    // 1. 气球底部接近平台顶部
    // 2. 气球垂直速度向下或为0（正在下落或准备降落）
    // 3. 气球的水平位置必须在平台范围内
        
        val playerBottom = player.position.y + player.size / 2
        val platformTop = platform.position.y
        val verticalDistance = playerBottom - platformTop
        
        // 大幅放宽垂直距离检测条件，确保气球能够更容易地被检测到与平台碰撞
        val verticalDistanceCondition = 
            verticalDistance >= -10 && verticalDistance <= 15 // 扩大检测范围，允许更多误差
        
        // 计算气球的宽度和边界
        val playerLeft = player.position.x - player.size / 2
        val playerRight = player.position.x + player.size / 2
        
        // 放宽水平碰撞检测：只要气球底部的一部分在平台范围内即可
        val horizontalOverlapCondition = 
            playerRight > platform.position.x && playerLeft < platform.position.x + platform.width
        
        // 气球底部中心与平台顶部的垂直距离条件
        val bottomCenterY = player.position.y + player.size / 2
        val centerYCondition = bottomCenterY >= platform.position.y - 5 && 
                              bottomCenterY <= platform.position.y + 10
        
        // 综合判断：速度条件 + 垂直距离条件 + 水平重叠条件
        // 确保即使气球边缘接触平台也能被正确检测
        return (player.verticalVelocity >= 0) && // 正在下落或准备降落
               verticalDistanceCondition && // 底部接近平台顶部
               horizontalOverlapCondition && // 水平方向有重叠
               centerYCondition // 底部中心在合适位置
    }
    


    /**
 * 检测气球是否与氦气罐碰撞
 * @param player 气球对象
 * @param bucket 氦气罐对象
 * @return 是否发生碰撞
 */
fun checkPlayerBucketCollision(player: Player, bucket: Bucket): Boolean {
    // 创建气球的碰撞矩形
        val playerRect = RectF(
            player.position.x - player.size / 2,
            player.position.y - player.size / 2,
            player.position.x + player.size / 2,
            player.position.y + player.size / 2
        )
        
        // 创建氦气罐的碰撞矩形
        val bucketRect = RectF(
            bucket.position.x - bucket.size / 2,
            bucket.position.y - bucket.size / 2,
            bucket.position.x + bucket.size / 2,
            bucket.position.y + bucket.size / 2
        )
        
        // 检测两个矩形是否相交
        return playerRect.intersect(bucketRect)
    }

    /**
     * 检测点是否在矩形内
     * @param pointX 点的X坐标
     * @param pointY 点的Y坐标
     * @param rectLeft 矩形左边界
     * @param rectTop 矩形上边界
     * @param rectRight 矩形右边界
     * @param rectBottom 矩形下边界
     * @return 点是否在矩形内
     */
    fun pointInRect(
        pointX: Float,
        pointY: Float,
        rectLeft: Float,
        rectTop: Float,
        rectRight: Float,
        rectBottom: Float
    ): Boolean {
        return pointX >= rectLeft && pointX <= rectRight &&
               pointY >= rectTop && pointY <= rectBottom
    }

    /**
     * 检测两个矩形是否相交
     * @param rect1 第一个矩形
     * @param rect2 第二个矩形
     * @return 两个矩形是否相交
     */
    fun rectIntersect(rect1: RectF, rect2: RectF): Boolean {
        return !(rect1.right < rect2.left ||
                 rect1.left > rect2.right ||
                 rect1.bottom < rect2.top ||
                 rect1.top > rect2.bottom)
    }

    /**
     * 检测小球是否与平台碰撞（用于简化的圆形碰撞检测）
     * @param ballX 球心X坐标
     * @param ballY 球心Y坐标
     * @param ballRadius 球半径
     * @param platform 平台对象
     * @return 是否发生碰撞
     */
    fun checkBallPlatformCollision(
        ballX: Float,
        ballY: Float,
        ballRadius: Float,
        platform: Platform
    ): Boolean {
        // 找到平台上距离球心最近的点
        val closestX = Math.max(platform.position.x, Math.min(ballX, platform.position.x + platform.width))
        val closestY = Math.max(platform.position.y, Math.min(ballY, platform.position.y + platform.height))
        
        // 计算球心到最近点的距离
        val distanceX = ballX - closestX
        val distanceY = ballY - closestY
        val distanceSquared = distanceX * distanceX + distanceY * distanceY
        
        // 比较距离的平方和半径的平方
        return distanceSquared < ballRadius * ballRadius
    }
}